package thread;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class Demo30 {
    //创建线程实现 1+2+3.....+100 的数值
    //正常使用线程
    private static int total = 0;
    public static void main(String[] args) throws InterruptedException {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                int sum = 0;
                for (int i = 1; i <= 100; i++) {
                    sum += i;
                }
                total = sum;
            }
        };

        Thread t = new Thread(runnable);
        t.start();
        t.join();
        System.out.println(total);
    }

    //使用 Callable 方法
    public static void main1(String[] args) throws ExecutionException, InterruptedException {
        // Callable接口的使用
        // Callable创建出来的只是一个 带有返回值的 任务
        Callable<Integer> callable = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                int sum = 0;
                for(int i = 1;i <= 100; i++) {
                    sum += i;
                }
                return sum;
            }
        };
        //并没有真的执行，我们需要使用 Thread 来执行这个任务
        //但是我们的 Thread 这个创建线程的类是没有 带Callable的构造方法的，
        //所以我们这里想要执行 Callable定义的任务就需要用到另一个类 —— FutureTask
        FutureTask task = new FutureTask(callable);

        Thread t = new Thread(task);
        t.start();
        //这里的 get() 方法也是可能会阻塞等待的
        //如果当前的线程没有执行完，就会阻塞等待，反之则不会阻塞等待
        System.out.println(task.get());
    }
}
